// 接口：interface：它和类型别名很像，但是接口的值必须是一个对象
// 而类型别名可以是一个单独的类型，如 type Lady = string  这样写是没问题的

// 定义一个接口
interface Girl {
  name: string
  age: number
  [propname: string]: any // 这里相当于给了一个自定义 key 和 值的字段，key 必须是字符串类型而值可以是任意类型
  sex?: string // 这里表示这个 sex 的值是一个字符串 但是 这个字段不是必填项
  say(): string // 这里表示使用这个接口的对象还必须有一个say方法且得返回字符串
}
// 这里再定义一个新的接口 Teacher，它继承自 Girl 则 它有了所有 Girl 接口的属性规则且它还可以为自己新增其他的属性规则
interface Teacher extends Girl {
  teach(): string // 这里为 Teacher 接口新增了一个方法，该方法必须返回一个字符串
}

// 这里有一个类 它需要满足 Girl 接口定义的所有规则
class XiaoJieJie implements Girl {
  name = '小红'
  age = 15
  address = '北京'
  say() {
    return '你好，我是小红'
  }
}
const user1 = {
  name: '月月',
  age: 20,
  sex: '女',
  say() {
    return '你好，我是月月'
  },
  teach() {
    return '我是一个老师'
  },
}
// 写一个判断一个对象是否成年的方法,这个对象必须要满足 Girl 接口的数据规则
const isChengNian = (user: Girl) => {
  user.age < 18 && console.log(user.name + '是未成年')
  user.age >= 18 && console.log(user.name + '是成年人了')
}
// 再写一个方法用于展示一个对象的所有信息，该对象必须要满足 Teacher 接口的数据规则
const seeUserDatas = (user: Teacher) => {
  console.log(user.name + '的年龄是' + user.age)
  console.log(user.name + '是' + user.sex + '性')
  user.address && console.log(user.name + '来自' + user.address)
  console.log(user.name + '说：' + user.say())
  console.log(user.name + '说：' + user.say())
}

isChengNian(user1)
seeUserDatas(user1)
